import { Client } from 'minio';
import { OssConfig } from '@/models';
import { Op } from 'sequelize';

// MinIO 配置（默认值）
export let minioConfig = {
  endPoint: 's3.minion.xlcig.cn',
  port: 443,
  useSSL: true,
  forcePathStyle:true,
  accessKey: 'admin',
  secretKey: 'StrongPass123!',
  bucketName: 'xux',
  region: 'us-east-1',
};

// MinIO 客户端实例
let minioClientInstance: Client | null = null;

// 从数据库加载配置
export async function loadMinioConfigFromDB(): Promise<void> {
  try {
    // 查找默认且启用的 MinIO 配置
    const ossConfig = await OssConfig.findOne({
      where: {
        type: 'minio',
        isDefault: true,
        isActive: true,
        tenantId: { [Op.is]: null } as any,
      },
    });

    if (ossConfig) {
      minioConfig.endPoint = ossConfig.endpoint;
      minioConfig.port = ossConfig.port;
      minioConfig.useSSL = ossConfig.useSsl;
      minioConfig.accessKey = ossConfig.accessKey;
      minioConfig.secretKey = ossConfig.secretKey;
      minioConfig.bucketName = ossConfig.bucketName;
      if (ossConfig.region) {
        minioConfig.region = ossConfig.region;
      }

      console.log('✅ MinIO 配置已从数据库加载');
      console.log('   - 配置名称:', ossConfig.name);
      console.log('   - 端点:', minioConfig.endPoint);
      console.log('   - 端口:', minioConfig.port);
      console.log('   - SSL:', minioConfig.useSSL);
      console.log('   - AccessKey:', minioConfig.accessKey);
      console.log('   - SecretKey:', '***已设置***');
      console.log('   - 桶名:', minioConfig.bucketName);
    } else {
      console.warn('⚠️  未找到默认的 MinIO 配置，使用内置默认配置');
    }
  } catch (error) {
    console.warn('⚠️  从数据库加载 MinIO 配置失败，使用默认配置', error);
  }
}

// 获取 MinIO 客户端实例
export function getMinioClient(): Client {
  if (!minioClientInstance) {
    minioClientInstance = new Client({
      endPoint: minioConfig.endPoint,
      port: minioConfig.port,
      useSSL: minioConfig.useSSL,
      accessKey: minioConfig.accessKey,
      secretKey: minioConfig.secretKey,
    });
  }
  return minioClientInstance;
}

// 用于向后兼容
export const minioClient = new Proxy({} as Client, {
  get(_target, prop) {
    return getMinioClient()[prop as keyof Client];
  },
});

// 初始化 MinIO，确保桶存在
export async function initMinIO(): Promise<void> {
  try {
    // 先从数据库加载配置
    await loadMinioConfigFromDB();
    
    // 重新创建客户端实例以使用新配置
    minioClientInstance = null;
    const client = getMinioClient();
    
    console.log(`🔄 正在测试 MinIO 连接...`);
    console.log(`   - 端点: ${minioConfig.endPoint}:${minioConfig.port}`);
    console.log(`   - SSL: ${minioConfig.useSSL ? '启用' : '禁用'}`);
    console.log(`   - 桶名: ${minioConfig.bucketName}`);
    console.log(`   - AccessKey: ${minioConfig.accessKey}`);
    
    // 测试桶是否存在（非阻塞）
    const bucketExists = await client.bucketExists(minioConfig.bucketName);
    
    if (bucketExists) {
      console.log(`✅ MinIO 连接成功，桶 "${minioConfig.bucketName}" 已存在`);
    } else {
      console.warn(`⚠️  桶 "${minioConfig.bucketName}" 不存在，请在 MinIO 控制台创建`);
    }
  } catch (error: any) {
    console.error('❌ MinIO 连接失败:', error.message || error);
    console.warn('⚠️  文件上传功能将不可用');
    console.warn('📝 请检查以下配置：');
    console.warn('   1. MinIO 服务地址是否正确');
    console.warn('   2. Access Key 和 Secret Key 是否正确');
    console.warn('   3. 网络是否可以访问 MinIO 服务');
    console.warn('   4. 可以在前端 /files/config 页面修改配置');
    // 不再抛出错误，允许系统继续启动
  }
}

// 获取文件的公开访问 URL
export function getPublicUrl(objectName: string): string {
  return `https://${minioConfig.endPoint}/${minioConfig.bucketName}/${objectName}`;
}

export { getMinioClient as default };

